"""
Регистрация при необходимости.
Загружает куки. Собирает ссылки на вакансии
Удаляет старые вакансии
Собирает описание вакансий
Удаляет организации без телефонов.
Удаляет дубли по телефонам и запрещенные организации.
Сливает вакансии в общую таблицу.
Ссылки на вакансии из рабочей таблицы добавляются в архив ссылок
Запоминает куки и выходит.
"""

import sys
import os
import logging                                                                  # запись логов
##import re                                                                       # регулярные выражения
import sqlite3

from statistics import mean, stdev

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *



def main():

    """ ГЛАВНЫЙ МОДУЛЬ.
    -- Инициальзация QT.
    -- Открываем SQLite. Делаем несколько курсоров.
    -- Создаем рабочие таблицы.
    -- Закачиваем таблицу продаж в БД.
    """

    app = QApplication(sys.argv)

    logging.basicConfig(filename='log.txt',level=logging.DEBUG,
        format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s %(message)s')

    conn = sqlite3.connect("data.db", isolation_level = None)
    query = conn.cursor()
    query2 = conn.cursor()
    update = conn.cursor()

    query.execute("CREATE TABLE IF NOT EXISTS source "
        "(date TEXT DEFAULT '', customer TEXT DEFAULT '', money REAL DEFAULT 0.0);")
    query.execute("CREATE TABLE IF NOT EXISTS abcxyz "
        "(customer TEXT DEFAULT '', money REAL DEFAULT 0.0, "
        "percent1 REAL DEFAULT 0.0, percent2 REAL DEFAULT 0.0, "
        "V REAL DEFAULT 0.0, ABC TEXT DEFAULT '', XYZ TEXT DEFAULT '');")
    #read_csv(conn)
    #quit()
    
    """ ABC-XYZ
    -- Суммируем весь доход для ABC анализа.
    -- Группируем таблицу по организациям. Для каждой вычмсляем процет вклада 
       в общую сумму и в нарастающий итог.
    -- Разводим по группам в соответствии с процентами.
    -- 
    """
    query.executescript("DELETE FROM abcxyz; VACUUM;")                          
    
    query.execute("SELECT sum(money) FROM source")
    total = query.fetchone()[0]

    accruing = 0.0
    query.execute("SELECT customer, sum(money) AS x FROM source GROUP BY customer  ORDER BY x DESC")
    for customer, money in query:
    
        percent1  = money * 100.0/total
        accruing += money
        percent2 = accruing * 100.0/total
        
        if percent2 <= 80.0:
            ABC = 'A'
        elif percent2 >= 95.0:
            ABC = 'C'
        else:
            ABC = 'B'
        query2.execute("SELECT money FROM source WHERE customer = ?",(customer,))
        data = []
        for money2 in query2:
            data.append(money2[0])
        if len(data) > 1:
            adv = mean(data)
            sdev = stdev(data)
            V = sdev * 100.0 / adv
            if V <= 15.0:
                XYZ = 'X'
            elif V > 50.0:
                XYZ = 'Z'
            else:
                XYZ = 'Y'
        else:
            XYZ = 'ОДНА ПРОДАЖА'
        sql = ("INSERT INTO abcxyz (customer, money, percent1, percent2, ABC, V, XYZ) "
            "VALUES (?,?,?,?,?,?,?);")
        update.execute(sql,(customer, len(data), round(percent1,3),round(percent2,1), ABC, round(V,0) , XYZ))

 

def read_csv(conn):

    """ ЧТЕНИЕ CSV ФАЙЛА.
    -- Находим путь до рабочего стола. Открываем диалог открытия файла.
    -- Записываем file_name во внутреннюю переменную."""

    user_profile = os.environ['USERPROFILE']
    user_desktop = user_profile + "/Desktop"
    url, filter  = QFileDialog.getOpenFileName(None,
        caption="Заголовок окна", directory=user_desktop,
        filter="csv(*.csv)")

    update = conn.cursor()

    update.executescript("DELETE FROM source; VACUUM;")                          
    
    with open(url,'r',encoding='utf-8') as f_in:
        for line in f_in:
            line = line.rstrip()
            filds = line.split('$')
            date_ = "20{}-{}-{}".format(filds[1][6:8], filds[1][3:5], filds[1][0:2])
            sql = "INSERT INTO source (date, customer, money) VALUES (?,?,?);"
            update.execute(sql,(date_, filds[3], float(filds[4].replace(',','.'))))



if __name__ == '__main__':                                                      # ОСНОВНОЙ ЦИКЛ
    main()
